#!/usr/bin/env bash

# sed [options] {sed-commands} {input-file}
sed -n 'p' /etc/passwd

echo "---------------------1"

# 其中:
# -n 是选项 options
# 'p' 是命令 sed-commands, 用于打印
# /etc/passwd 是文件 input-file

# 执行多个 sed 命令
# 打印 /etc/passwd 文件中以 root、nobody 开头的行
sed -n -e '/^root/ p' -e '/^nobody/ p' /etc/passwd

echo "---------------------2"

# 多行写法
sed -n \
-e '/^root/ p' \
-e '/^nobody/ p' \
/etc/passwd

echo "---------------------3"

# 用花括号 {} 将多个命令分组执行
sed -n '{
    /^root/ p
    /^nobody/ p
}' /etc/passwd

echo "---------------------4"

# sed 默认会输出，如果使用命令 p，相当于输出两次
sed 'p' employee.txt
echo ""

echo "---------------------5"

# 使用 -n 选项可以抑制默认的输出
sed -n 'p' employee.txt
echo ""

echo "---------------------6"
echo "--------只打印第 2 行"
# 只打印第 2 行
sed -n '2 p' employee.txt

echo "--------打印 1 ~ 4 行"
# 打印 1 ~ 4 行
sed -n '1,4 p' employee.txt

echo "--------打印 2 ~ 最后一行"
# 打印 2 ~ 最后一行
sed -n '1,$ p' employee.txt
echo ""

# 可以用一下符号修改打印的范围
# , 比如 1,4 表示 1 至 4 行
# + 比如 1+4 表示从第 1 行开始的 4 行
# ~ 比如 1~2 表示从第 1 行开始每次跳过 2 行
#       比如 1~2 匹配 1,3,5,7......
#       比如 2~2 匹配 2,4,6,8......
#       比如 1~3 匹配 1,4,7,10......
#       比如 2~3 匹配 2,5,8,11......

echo "--------打印奇数行"
# 打印奇数行
sed -n '1~2 p' employee.txt
echo ""

echo "---------------------7"

echo "--------打印含有 "Jane" 的行"
sed -n '/Jane/ p' employee.txt
echo ""

echo "--------打印第一次匹配 Jason 的行至第 4 行的内容"
sed -n '/Jason/,4 p' employee.txt
echo ""

# 注意：如果开始的 4 行中，没有匹配到 Jason,那么 sed 会打印第 4 行以后匹配到 Jason 的内容
# 
# 比如 employee.txt 的内容改成这样：
#     101,John Doe,CEO
#     102,JasXXXon Smith,IT Manager
#     103,Raj Reddy,Sysadmin
#     104,Anand Ram,Developer
#     105,Jane Miller,Sales Manager
#     106XXX,Jason Smith,IT Manager
#     107XXX,Raj Reddy,Sysadmin
#     108XXX,Anand Ram,Developer
#     109XXX,Jane Miller,Sales Manager
#     110XXX,Jane Miller,Sales Manager
# 
# 运行 sed -n '/Jason/,4 p' employee.txt 打印的是：
# 106XXX,Jason Smith,IT Manager


echo "--------打印从第一次匹配 Raj 的行到最后的所有行"
sed -n '/Raj/,$ p' employee.txt
echo ""


echo "--------打印自匹配 Raj 的行开始到匹配 Jane 的行之间的所有内容"
sed -n '/Raj/,/Jane/ p' employee.txt
echo ""


echo "--------打印自匹配 Raj 的行开始到匹配 Jane 的行之间的所有内容"
sed -n '/Raj/,/Jane/ p' employee.txt
echo ""

echo "--------打印匹配 Jason 的行和其后面的两行"
sed -n '/Jason/,+2 p' employee.txt
echo ""

echo "---------------------8 替换"

echo "--------只把包含 Sales 的行中的 Manager 替换为 Director"
sed '/Sales/ s/Manager/Director/' employee.txt
echo ""

echo "--------用大写 A 替换第一次出现的小写字母 a"
sed 's/a/A/' employee.txt
echo ""

echo "--------把所有小写字母 a 替换为大写字母 A"
sed 's/a/A/g' employee.txt
echo ""

echo "--------使用刚才建立的文件，把每行中第二次出现的 locate 替换为 find"
sed 's/locate/find/2' substitute-locate.txt
echo ""

echo "--------只打印替换后的行"
sed -n 's/John/Johnny/p' employee.txt
echo ""

echo "--------把每行中第二次出现的 locate 替换为 find 并打印出来"
sed -n 's/locate/find/2p' substitute-locate.txt
echo ""

echo "---------------------12.执行命令标志 e (excuate)"

echo "--------在 files.txt 文件中的每行前面添加 ls –l 并打击结果"
sed 's/^/ls -l /' files.txt
echo ""

echo "--------在 files.txt 文件中的每行前面添加 ls –l 并把结果作为命令执行"
sed 's/^/ls -l /e' files.txt
echo ""


echo "---------------------17.分组替换"

echo "--------单个分组"
sed 's/\([^,]*\).*/\1/g' employee.txt
echo ""

echo "--------显示 /etc/password 的第一列"
sed 's/\([^:]*\).*/\1/' /etc/passwd
echo ""

echo "--------给大写的字母加上圆括号"
echo "The Geek Stuff" | sed 's/\(\b[A-Z]\)/\(\1\)/g'
echo ""

echo "--------格式化数字"
sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' numbers.txt
echo ""




